package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.Cliente;
import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.ParteTrabajo;
import es.uned.etsii.si3.taller.Usuario;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;


public class CLIPresupuestos extends ActionSupport implements SessionAware {
	
	private static final long serialVersionUID = 1L;
	
	private  	Map<String, Object>		userSession;
	
	private 	ParteTrabajo		parteSeleccionado = null;
	public 		ParteTrabajo		getParteSeleccionado() 					{ return this.parteSeleccionado; }
	public 		void				setParteSeleccionado(ParteTrabajo pT) 	{ this.parteSeleccionado = pT; }

	private 	static int 			parteSeleccionadoID = -1;
	public 		int					getParteSeleccionadoID() 				{ return parteSeleccionadoID; }
	public 		void				setParteSeleccionadoID(int i) 			{ parteSeleccionadoID = i; }

	private 	Cliente				clienteSeleccionado = null;
	public 		Cliente				getClienteSeleccionado()				{ return this.clienteSeleccionado; }
	public 		void				setClienteSeleccionado(Cliente c)	 	{ this.clienteSeleccionado = c; }

	private 	static int 			clienteSeleccionadoID = -1;
	public 		int					getClienteSeleccionadoID() 				{ return clienteSeleccionadoID; }
	public 		void				setClienteSeleccionadoID(int i) 		{ clienteSeleccionadoID = i; }

	private 	List<ParteTrabajo>	listaPartes;		
	public		List<ParteTrabajo>	getListaPartes() 						{ return this.listaPartes; }
	public 		void				setListaPartes(List<ParteTrabajo> l)	{ this.listaPartes = l; }

	
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.USUARIO_PRESUPUESTOS_PENDIENTES)	
	public CLIPresupuestos() {
		super();
	}
	
	/**
	 * Carga la lista de presupuestos pendientes de aceptar por el cliente
	 * @return action error
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.USUARIO_PRESUPUESTOS_PENDIENTES)	
	public String cargarPresupuestosPendientes() throws SQLException {
		String res = SUCCESS;
		QueryBuilder<ParteTrabajo, Integer> parteQb = FactoriaDAO.getDao(ParteTrabajo.class).queryBuilder();
		Where<ParteTrabajo, Integer> wParteQb = parteQb.where();
		wParteQb.eq(ParteTrabajo.ID_USUARIO_FIELD_NAME, this.getDatosCliente().getUsuario());
		wParteQb.and().eq(ParteTrabajo.ACEPTADO_FIELD_NAME, false);
		wParteQb.and().isNotNull(ParteTrabajo.PRECIOPRESUPUESTO_FIELD_NAME);
		this.listaPartes = parteQb.query();		
		return res;
	}
	
	/**
	 * Modifica el parte de trabajo para indicar que el cliente lo ha aceptado
	 * @return actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.USUARIO_PRESUPUESTOS_PENDIENTES)	
	public String cliPresupuestoAceptar() throws SQLException {
		String res = SUCCESS;
		this.setClienteSeleccionado(this.getDatosCliente());
		this.setClienteSeleccionadoID(this.getClienteSeleccionado().getId());
		this.setParteSeleccionadoID(this.getParteSeleccionadoID());
		this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getParteSeleccionadoID()));
		this.getParteSeleccionado().setAceptado(true);
		this.getParteSeleccionado().update();
		return res;
	}

	private Cliente getDatosCliente() throws SQLException {
		Cliente res = null;
		Usuario uS = (Usuario) userSession.get("usuario");
		QueryBuilder<Usuario, Integer> usuarioQb = FactoriaDAO.getDao(Usuario.class).queryBuilder();
		Where<Usuario, Integer> wUsuarioQb = usuarioQb.where();			
		wUsuarioQb.eq(Usuario.ID_FIELD_NAME, uS.getId());
		
		QueryBuilder<Cliente, Integer> clienteQb = FactoriaDAO.getDao(Cliente.class).queryBuilder();
		Where<Cliente, Integer> wClienteQb = clienteQb.where();			
		wClienteQb.eq(Cliente.ID_USUARIO_FIELD_NAME, uS.getId());
		
		List<Cliente> lista = clienteQb.query();
		res = lista.get(0);		
		return res;
	}

	

	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;
	}

}
